{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第三章 基于pandas和可视化分析清洗电商平台数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "************************************************************\n",
    "************************************************************\n",
    "## 实验3-1 数据预处理实验讲解：\n",
    "### 一、实验目的\n",
    "了解pandas的常用函数\n",
    "了解数据清洗的基础方法\n",
    "\n",
    "### 二、实验环境\n",
    "Python3开发环境，第三方包有pandas\n",
    "\n",
    "### 三、实验原理\n",
    "本实验将利用pandas该python第三方包对爬取的数据进行清洗。pandas 是基于NumPy 的一种工具，该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型，提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现，它是使Python成为强大而高效的数据分析环境的重要因素之一。\n",
    "\n",
    "### 四、步骤讲解\n",
    "参考实验手册\n",
    "此小节主要讲述的是数据预处理。主要包含以下四个部分：\n",
    "\n",
    "1、去重（去除重复数据）；\n",
    "\n",
    "2、据观察，搜索结果中仍含有红酒杯，讲解红酒的书籍等其他商品数据，此部分将利用商品属性来进行判别，红酒有酒精度，特性，品类等特征，非红酒商品则没有那些属性，以此作为判断依据进行数据的删选；\n",
    "\n",
    "3、据观察，平台上红酒的销售有瓶装，礼盒装，箱装等不同包装，即需要调整价格，且容量和包装这两个属性也并不可信，有些是总数的显示，有些是见瓶身，见包装的字样，唯一较为可靠的是销售平台的标题，此处将采用自然语言处理中的词性分析解析得到红酒的数量。为简化后续同级红酒的比较，经统计，750ml的红酒占多数，此处选择删选其他容量数据，仅提取750ml的红酒相关数据；\n",
    "\n",
    "4、对无用的列或是数据较为繁杂不准确的列进行删选；"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 五、实验步鄹\n",
    "************************************************\n",
    "### 步鄹1:上传实验数据\n",
    "\n",
    "在当前目录创建data文件夹，并从“项目课件”或者“数据中心”下载项目数据（电商红酒.csv、红酒品牌.csv、微博红酒.csv）,并将下载的数据上传到data文件夹下。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "************************************************\n",
    "### 步鄹2:处理数据格式\n",
    "\n",
    "首先利用json.loads解决爬取数据中的中文编码问题，如下代码所示：\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import csv\n",
    "import json\n",
    "csvfile = open('./data/电商红酒.csv', 'r')\n",
    "reader = csv.reader(csvfile)#读取到的数据是将每行数据当做列表返回的\n",
    "rows = []#用来存储解析后的没条数据\n",
    "for row in reader:\n",
    "    row_str = \",\".join(row)#row为list类型需转为str，该数据变为字典型字符串\n",
    "    row_dict = json.loads(row_str)#\n",
    "    #将每行数据中嵌套字典拆开存储到列表中\n",
    "    newdict = {}\n",
    "    for k in row_dict:\n",
    "        if type(row_dict[k]) == str:#将键值对赋给新字典\n",
    "            newdict[k] = row_dict[k]\n",
    "        elif type(row_dict[k]) == dict:#若存在嵌套字典，将该字典中的key和value作为属性和属性值\n",
    "            newdict.update(row_dict[k])\n",
    "    rows.append(newdict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "然后利用pandas将数据转化为DataFrame形式，并保存为csv文件，如下代码所示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "df = pd.DataFrame(rows)#将字典型数组转为DataFrame形式\n",
    "#将DataFrame 写入到 csv 文件\n",
    "df.to_csv(\"wine_df_shop.csv\",encoding=\"utf-8_sig\", index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最后查看数据量和数据维度，如下代码所示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(33734, 266)\n",
      "['name' 'sku_id' 'id' 'price' 'shop_name' 'shop_id' 'url' 'keyword' '容量'\n",
      " '产品重量（kg）' '包装' '存储方法' '酒精度' '香型' '等级' '省份' '产区' '年份' '保质期' '类别' '葡萄品种'\n",
      " '甜度' '口感' '颜色' '原产地' '特性' '国产/进口' '口味' '原料' '产地' '编者' 'ISBN' '版次' '出版社'\n",
      " '出版时间' '丛书名' '正文语言' '开本' '印次' '印刷时间' '主题词' '品牌' '材质' '尺寸（长宽高、杯口、杯底直径、容量）'\n",
      " '著者' '外文名' '页数' '中图法分类号' '套装数量' '用纸' '读者对象' '规格' '产品包装' '分类' '功效' '人群'\n",
      " '适合肤质' '原产国' '类型' '适用人群' '储存方法' '附件数量' '字数' '净重量（kg）' '译者' '绘者' '型号' '附件'\n",
      " '产品展示尺寸（cm)' '产品包装尺寸（cm）' '产品承重量（kg）' '产品包装重量（kg）' '净尺寸(mm)' '净重(KG)'\n",
      " '产品类别' '尺寸' '是否含糖' '题材' '组合形式' '图片形式' '装裱形式' '工艺' '画芯材质' '幅数' '规格（长宽高）'\n",
      " '认证型号' '安装方式' '开门方式' '温区' '制冷方式' '层架材质' '审图号' '介质' '片长' '碟数' '配音语言'\n",
      " '音频格式' '字幕语言' '地区' '导演' '演员' '尺寸（mm）' '重量（kg）' '商品包装' '国别' '用途' '容积（L）'\n",
      " '冷藏容积（L）' '冷冻容积（L）' '冷冻能力(kg/24h)' '能效等级' '电压' '产品尺寸（mm）' '产品净重（kg）' '层数'\n",
      " '产品尺寸（长x宽x高mm）' '原麦汁浓度' '风格' '适用空间' '摆放位置' '厚度' '面料' '产品尺寸（长*宽）CM：' '填充物'\n",
      " '包装规格' '产品执行标准' '配料' '生产许可证号' '净含量' '品类' '产品展开尺寸（cm）' '商品承重量（kg）' '造型'\n",
      " 'CT数' '原材料产地' '产品尺寸（cm）' '年代' '度数' '表面处理' '作者' '材质（杯体、盖子、密封圈、杯口环、茶网）'\n",
      " '保温时间' '是否有盖' '方案' '保质期（年）' '产品产地' '单片净含量（mL）' '净含量（mL/g）' '是否为特殊用途化妆品'\n",
      " '产品包装尺寸' '品相' '系列' '外壳材质' '接口类型' '钥匙孔' '指示灯' '重量（g）' '独特设计' '层位'\n",
      " '组立尺寸（cm）' '包装尺寸（cm）' '商品承重（kg）' '是否有茶格' '款式' '尺寸（cm）' '主要材质成分' '开口方式'\n",
      " '肩带长度（cm）' '斜挎带' '是否可折叠' '功能位' '能否放A4文件' '主袋' '手机袋' '证件袋' '拉链暗袋' '电脑插袋'\n",
      " '材质（锅体、锅盖、锅底）' '规格（直径、内径、每个隔层之间的距离）' '适用炉灶' '头数' '花器风格' '组套件数' '适用季节'\n",
      " '注释' '校对' '口述' '朗读' '编纂' '摄影' '书写' '整理' '主体材质' '形状' '是否双面' '表盘材质' '镜面材质'\n",
      " '毯子尺寸' '节日' '功能' '包装礼盒' '长度(m)' '是否有扶手' '是否含龙头' '产品展开尺寸（cm)' '主色调' '组合'\n",
      " '香味' '图案' '适用对象' '产品型号' '产品品牌' '净含量（mL）' '生产许可证' '阀芯' '链子样式' '链子材质'\n",
      " '规格（cm）' '色号颜色' '妆效' '产品标准号' '表面工艺' '最大读取速度(MB/s)' '最大写入速度(MB/s)'\n",
      " '净含量（kg）' '壁饰题材' '场景' '电压(V)' '照明功率(W)' '照射面积(㎡)' '光源个数' '光源类型' '灯罩材质'\n",
      " '灯身材质' '灯口' '控制方式' '产品净重(kg)' '产品尺寸(mm)' '适用场景' '是否冷热水' '是否360°出水'\n",
      " '产品承重（kg）' '使用尺寸（cm）' '收纳尺寸（cm）' '袖长' '花型' '产品尺寸（长*宽*高）' '贮存条件' '容量(L)'\n",
      " '水槽样式' '笔尖材质' '笔杆材质' '容量（ml）' '适用型号' '证书' '场合' '成色' '有无钢圈' '适用尺寸' '摆放方式'\n",
      " '功率(W)' '开关类型' '是否带光源' '功能特性' '固定方式' '产品展示尺寸（cm）']\n"
     ]
    }
   ],
   "source": [
    "print(df.shape)\n",
    "print(df.columns.values)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "************************************************\n",
    "## 结果分析：\n",
    "\n",
    "可见，总共有33734条数据，266维属性；查看一下保存的文件，观察数据发现有很多属性（如CT数、ISBN、面料、页数、题材等）不属于本主题“红酒”研究属性，可能是以关键词爬取数据时获取的有关红酒书籍、醒酒器、酒具等方面的数据，这些噪声数据应予以删除，后续会介绍具体讲解。\n",
    "************************************************"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "************************************************\n",
    "### 步鄹3:处理关键字\n",
    "目前关键词字段存储的是\"品牌 红酒\"（如“拉菲 红酒”，“LAFITE 红酒”），处理流程如下：\n",
    "\n",
    "1、首先去掉关键词中的“红酒”字符,只保留红酒品牌\n",
    "\n",
    "2、其次对于红酒品牌存在中英文两种表述的，统一归为形如“拉菲/LAFITE”形式\n",
    "\n",
    "代码如下所示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0                 泸州老窖\n",
      "1                   美绚\n",
      "2           通化/tonghua\n",
      "3        长城/greatwall \n",
      "4        长城/greatwall \n",
      "5    干露/concha y toro \n",
      "6            拉菲/lafite\n",
      "7            山图/shantu\n",
      "8            山图/shantu\n",
      "9            山图/shantu\n",
      "Name: keyword, dtype: object\n"
     ]
    }
   ],
   "source": [
    "# 处理红酒名称（统一规范中文/英文的格式）\n",
    "#去keyword中“红酒”字符\n",
    "df['keyword']=df['keyword'].str.split('红酒').str[0]\n",
    "\n",
    "#整理红酒品牌\n",
    "brand = pd.read_csv(\"./data/红酒品牌.csv\",header=None,encoding=\"utf-8\")\n",
    "brands =[]\n",
    "for k1,k2 in zip(list(brand[0]),list(brand[1])):\n",
    "    if pd.isnull(k2):\n",
    "        brands.append(k1)\n",
    "    else:\n",
    "        brands.append(k1+\"/\"+k2)\n",
    "        \n",
    "# 品牌替换\n",
    "def modify_keywords(w, lists):\n",
    "    for b in lists:\n",
    "        if w.strip() in b:\n",
    "            return b\n",
    "    return w.strip()\n",
    "\n",
    "\n",
    "df['keyword'] = df['keyword'].apply(modify_keywords, lists =brands)\n",
    "df['keyword']=df['keyword'].str.lower()#转化为小写\n",
    "\n",
    "print(df[\"keyword\"].head(10))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "************************************************\n",
    "### 步鄹4:去除重复数据\n",
    "由于红酒品牌搜索时有中文和英文，可能会存在相同数据，根据url属性来判断两条数据是否重复。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "不存在重复数据\n",
      "(33734, 266)\n"
     ]
    }
   ],
   "source": [
    "#若爬取数据有相同的url，则认为是相同数据，只保留一条\n",
    "\n",
    "#数据是否有相同行，若有返回true，否则False\n",
    "if df.duplicated(subset=[\"url\"], keep=False).any(): \n",
    "    print(\"存在重复数据\")\n",
    "    df = df.drop_duplicates(subset=[\"url\"], keep=\"first\")\n",
    "else:\n",
    "    print(\"不存在重复数据\")\n",
    "print(df.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "************************************************\n",
    "### 步鄹5:过滤非红酒类商品\n",
    "\n",
    "观察数据，发现数据中还存在红酒杯、醒酒器黄酒等噪声数据，而“甜度”是红酒的一般特性，若无该属性则很大程度上是非红酒数据，可能酒具以及黄酒白酒等数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(18734, 266)\n"
     ]
    }
   ],
   "source": [
    "df = df.dropna(subset=[\"甜度\"])\n",
    "print(df.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "************************************************\n",
    "### 步鄹6:过滤非750ml红酒数据并处理价格\n",
    "将删除“产品重量”属性，因为包装不同，礼盒或者整箱产品包装中带有赠品，酒杯酒具等物品，质量变化数据不可靠，难以清洗。\n",
    "\n",
    "统一红酒容量为750ml，并计算单瓶价格；继而可以删除标题，包装和容量三个属性列。\n",
    "\n",
    "据观察，包装和容量的形容多样，单位也多样，标题的可信度反而相对较高，所以我们从标题中匹配750ml的红酒数据。\n",
    "\n",
    "操作步骤如下：\n",
    "\n",
    "1、保留标题中含有750字样的数据；\n",
    "\n",
    "2、含有特殊的瓶数转换成相应的数字，转第4步；\n",
    "\n",
    "        若匹配到两次及两次以上，则排除该数据。\n",
    "        \n",
    "3、利用jieba分词工具提取标题中的数字，仅保留限定数值之内的数据：\n",
    "\n",
    "        若750后面的数字存在，则认为是瓶数，转第4步；\n",
    "        \n",
    "        若750前面的数字存在，则认为是瓶数，转第4步；\n",
    "        \n",
    "        若前后都没有限定数值之内的数字出现，判断是单瓶，转第4步；\n",
    "        \n",
    "        若750前后面的数字都存在，则排除该数据。\n",
    "        \n",
    "4、重新计算价格。\n",
    "\n",
    "具体代码如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(12990, 266)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/python3/lib/python3.6/site-packages/pandas/core/indexing.py:189: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  self._setitem_with_indexer(indexer, value)\n"
     ]
    }
   ],
   "source": [
    "# 提取瓶数和重新计算价格\n",
    "#红酒商品描述中有含有的数字主要有三种年份、容量和瓶数，容量固定为750，主要识别瓶数\n",
    "\n",
    "# 挑出含750字样的数据\n",
    "df = df[df[\"name\"].str.contains(\"750\")]\n",
    "print(df.shape)\n",
    "\n",
    "#处理价格\n",
    "import jieba.posseg as pseg\n",
    "\n",
    "def get_numbers(words, num_type = \"int\"):\n",
    "    \"\"\"返回string中的数字\n",
    "    Args:\n",
    "        words: 字符串\n",
    "        num_type: 获取字符串中float型数字还是int型数字\n",
    "    \"\"\"\n",
    "    nums = []\n",
    "    for w,p in pseg.cut(words): #jieba词性标注不能将“750ml*6\"中的6识别为数字，换一种方式\n",
    "        if num_type == \"int\":\n",
    "            try: nums.append(int(w))\n",
    "            except:continue\n",
    "        if num_type == \"float\":\n",
    "            try: nums.append(float(w))\n",
    "            except:continue\n",
    "    return nums\n",
    "\n",
    "wine_bottles = {}          #存放红酒瓶数字典\n",
    "with open(\"./dict/wine_bottles.txt\",\"r\",encoding = \"utf-8\") as f:\n",
    "    for line in f.readlines():\n",
    "        k,v = line.strip().split(\" \")\n",
    "        wine_bottles[k]=v\n",
    "\n",
    "df_index = df.index.tolist()  #获取df索引列表\n",
    "df[\"price\"] = df[\"price\"].astype(\"float\") #更改数据类型\n",
    "\n",
    "for i, name in zip(df_index, df[\"name\"]):\n",
    "    bottles = [int(wine_bottles[k])for k in wine_bottles if name.find(k) != -1]    #\n",
    "    if len(bottles) == 1:\n",
    "        df['price'].loc[i] = float('%.2f' % (df['price'].loc[i]/bottles[0]))\n",
    "        continue\n",
    "    elif len(bottles)>1:\n",
    "        df = df.drop(index = i,axis = 0)\n",
    "        continue\n",
    "        \n",
    "    numbers = get_numbers(name,\"int\")        #bottles==0，用jieba分词提取红酒标题中的数字\n",
    "    if 750 not in numbers:        #选取是含有750的样本，但结巴分词可能将750切成其他组合词，识别不出750这个数字，删除\n",
    "        df = df.drop(index = i,axis = 0)\n",
    "        continue\n",
    "    numbers = [n for n in get_numbers(name,\"int\") if n in [750,1,2,3,4,5,6,8,12]]        #提取标题中特定数字\n",
    "    if len(numbers) == numbers.count(750):         #只有750数字,认为是单瓶不处理\n",
    "        continue\n",
    "    if numbers.count(750) > 1:        #存在多个数字且750个数有多个，删除\n",
    "            df = df.drop(index = i,axis = 0)\n",
    "            continue\n",
    "    if numbers.index(750) == 0:        #存在多个数字，750只有一个，且750后面有数字,更改\n",
    "        df['price'].loc[i] = float('%.2f' % (df['price'].loc[i]/numbers[1]))\n",
    "    elif numbers.index(750) == -1:        #存在多个数字，750只有一个，且750前面有数字，更改\n",
    "        df['price'].loc[i] = float('%.2f' % (df['price'].loc[i]/numbers[-2]))\n",
    "    else:\n",
    "         df = df.drop(index = i,axis = 0)    #存在多个数字，750只有一个，且750前面后面都有数字，删除\n",
    "            \n",
    "df.drop([\"name\",\"包装\",\"容量\",\"产品重量（kg）\"], axis=1, inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "************************************************\n",
    "### 步鄹7:过滤无用属性\n",
    "删除缺失值比较多的属性列，查看每列缺失值的数目，具体代码如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "每列缺失值个数:\n",
      "CT数           11648\n",
      "ISBN          11648\n",
      "id                0\n",
      "keyword           0\n",
      "price             0\n",
      "shop_id           0\n",
      "shop_name         0\n",
      "sku_id            0\n",
      "url               0\n",
      "丛书名           11648\n",
      "中图法分类号        11648\n",
      "主体材质          11648\n",
      "主色调           11648\n",
      "主袋            11648\n",
      "主要材质成分        11648\n",
      "主题词           11648\n",
      "书写            11648\n",
      "产区                0\n",
      "产品产地          11648\n",
      "产品净重(kg)      11648\n",
      "产品净重（kg）      11648\n",
      "产品包装          11648\n",
      "产品包装尺寸        11648\n",
      "产品包装尺寸（cm）    11648\n",
      "产品包装重量（kg）    11648\n",
      "产品品牌          11648\n",
      "产品型号          11648\n",
      "产品尺寸(mm)      11648\n",
      "产品尺寸（cm）      11648\n",
      "产品尺寸（mm）      11648\n",
      "              ...  \n",
      "适用人群          11648\n",
      "适用场景          11648\n",
      "适用型号          11648\n",
      "适用季节          11648\n",
      "适用对象          11648\n",
      "适用尺寸          11648\n",
      "适用炉灶          11648\n",
      "适用空间          11648\n",
      "造型            11648\n",
      "配料            11648\n",
      "配音语言          11648\n",
      "酒精度               0\n",
      "重量（g）         11648\n",
      "重量（kg）        11648\n",
      "钥匙孔           11648\n",
      "链子材质          11648\n",
      "链子样式          11648\n",
      "镜面材质          11648\n",
      "长度(m)         11648\n",
      "阀芯            11648\n",
      "附件            11648\n",
      "附件数量          11648\n",
      "面料            11648\n",
      "音频格式          11648\n",
      "页数            11648\n",
      "题材            11648\n",
      "颜色                0\n",
      "风格            11648\n",
      "香味            11648\n",
      "香型            11648\n",
      "Length: 262, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "print(\"每列缺失值个数:\")\n",
    "print(df.isnull().sum())#统计每列的缺失值个数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "观察每列的缺失值数目，采用删除缺失值超过80%的列的策略"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [],
   "source": [
    "#删除列数据，thresh作用：保留至少有2329（11648*20%）个非 NA 数的列\n",
    "df = df.dropna(axis=1,thresh=2329)\n",
    "# 再删除[\"id\",\"shop_id\",\"shop_name\",\"sku_id\",\"url\"]\n",
    "df.drop([\"id\",\"shop_id\",\"shop_name\",\"sku_id\",\"url\"],axis=1,inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "************************************************\n",
    "## 六、实验总结\n",
    "本节我们基于pandas工具对爬取的数据进行格式和属性层面的清洗，包含以下步骤：\n",
    "\n",
    "1.数据格式的整理\n",
    "\n",
    "2.去除重复数据\n",
    "\n",
    "3.排除非红酒类商品\n",
    "\n",
    "4.计算单价\n",
    "\n",
    "5.删除无关属性\n",
    "\n",
    "在下节中我们将对空值属性进行处理。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*****************************************************************\n",
    "************************************************************\n",
    "## 实验3-2 处理空值的属性数据\n",
    "### 一、实验目的\n",
    "\n",
    "了解pandas的常用函数\n",
    "\n",
    "了解数据清洗的基础方法\n",
    "\n",
    "### 二、实验环境\n",
    "\n",
    "Python3开发环境，第三方包有pandas\n",
    "\n",
    "### 三、实验原理\n",
    "\n",
    "本实验将利用pandas该python第三方包对爬取的数据进行清洗。pandas 是基于NumPy 的一种工具，该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型，提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现，它是使Python成为强大而高效的数据分析环境的重要因素之一。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 四、实验步骤\n",
    "******************************************************\n",
    "### 步鄹1:处理空值\n",
    "\n",
    "主要是处理      类别    和    特性    缺失值用   众数    代替\n",
    "并查看有哪些属性是存在缺失的\n",
    "\n",
    "具体代码如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['keyword', 'price', '产区', '保质期', '原产地', '口感', '国产/进口', '存储方法',\n",
       "       '年份', '特性', '甜度', '类别', '葡萄品种', '酒精度', '颜色'], dtype=object)"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.columns.values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "keyword      0\n",
       "price        0\n",
       "产区           0\n",
       "保质期          0\n",
       "原产地          0\n",
       "口感           0\n",
       "国产/进口        0\n",
       "存储方法         0\n",
       "年份           0\n",
       "特性         117\n",
       "甜度           0\n",
       "类别          41\n",
       "葡萄品种         0\n",
       "酒精度          0\n",
       "颜色           0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.isnull().sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "********************************************************\n",
    "### 步鄹2:替换值筛选\n",
    "讲解：可见，本节我们需要处理的是特性和类别两个字段，由下图中的聚合语句结果中可发现两个字段都是有限种取值，即离散值，且考虑到同一品牌的红酒的特性、类别极大可能是相同的，因而采用众数替代的方法来处理缺失值，即拿同一品牌的红酒的特性、类别出现最多的值最为替代值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "特性\n",
       "普通餐酒               6123\n",
       "精品葡萄酒              1563\n",
       "列级庄                1455\n",
       "法定产区酒（AOC/AOP等）     958\n",
       "名庄葡萄酒               586\n",
       "中级庄                 578\n",
       "酒杯/酒具               167\n",
       "有机葡萄酒                76\n",
       "AOC/AOP              25\n",
       "dtype: int64"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby(\"特性\").size().sort_values(ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 步鄹3:众数替代缺失值\n",
    "    \n",
    "    具体代码如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 众数替代缺失值\n",
    "\n",
    "#上述统计结果可以看出“特性”和“类别”出现缺失值\n",
    "def process_nan(col,gp_col,df):\n",
    "    #计算该列分组众数,可能出现某个品牌的众数为nan，以“no match”代替\n",
    "    df_mode = df.groupby(gp_col)[col].agg(lambda x: next(iter(x.value_counts().index), 'no match'))\n",
    "    df[col] = df[col].fillna(df[gp_col].map(df_mode))\n",
    "    df = df[~df[col].isin([\"no match\"])] #删除“no match”\n",
    "    return df\n",
    "    \n",
    "df = process_nan(\"特性\", \"keyword\", df)\n",
    "df = process_nan(\"类别\", \"keyword\", df)\n",
    "\n",
    "# 保存数据\n",
    "df.to_csv(\"pre-processed.csv\",encoding=\"utf-8_sig\",index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 四、知识回顾\n",
    "如上述代码所示，我们保存下来 pre-processed.csv 文件，下节讲述利用pandaBI观察数据再对属性作调整。\n",
    "\n",
    "通过两节课程的学习，我们把源数据经过数据清洗工作暂时生成文件 pre-processed.csv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 五、实验总结\n",
    "上节我们基于pandas工具对爬取的数据进行格式和属性层面的清洗，本节在此基础上进行对空值进行处理，下节我们将学习通过工具pandaBI观察数据并整理数据。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "************************************************************\n",
    "************************************************************\n",
    "## 实验3-3 利用pandaBI查看数据各个维度的分布\n",
    "### 一、实验目的\n",
    "了解PandaBI的操作流程\n",
    "了解数据清洗的基础方法\n",
    "\n",
    "### 二、实验环境\n",
    "Python3开发环境，第三方包有pandas，工具有PandaBI\n",
    "\n",
    "### 三、实验原理\n",
    "本实验利用PandaBI可视化工具观察数据，并依然利用pandas工具对数据进行再清洗。\n",
    "### 四、实验步骤\n",
    "可利用pandas包中保存函数，将3.2节的最终处理结果进行保存为 pre-processed.csv，结合pandaBI可视化工具观察数据各个维度分布情况再做调整。\n",
    "本章首先简单介绍pandaBI的使用流程，再根据可视化结果对数据进行调整\n",
    "如实验手册所示：pandaBI主要有以下四个模块：\n",
    "\n",
    "数据大屏：用来做大屏展现（多个可视化分析结果的组合展现）\n",
    "\n",
    "仪表盘：可视化结果展示（可用作页面嵌入）\n",
    "\n",
    "工作表：进行多数据源的组合，也可以是单表数据\n",
    "\n",
    "数据源：支持多数据源的导入\n",
    "### 步鄹1:pandaBI的使用流程\n",
    "step1:导入数据\n",
    "\n",
    "进入数据源模块  =>  添加数据源 =>  选择csv  =>  填写数据源相关信息\n",
    "\n",
    "请参考实验手册：\n",
    "\n",
    "step2：构建数据表\n",
    "\n",
    "进入工作表模块，我们只有一张表，不需要和其他表做连接，所以只要新建工作表，拖拽出刚才的数据源，然后保存即可。\n",
    "\n",
    "请参考实验手册：\n",
    "\n",
    "step3：可视化分析\n",
    "\n",
    "进入仪表盘，即时可以开始进行对字段分析和探索了，数据大屏的展示和使用将在3.3节讲解。\n",
    "\n",
    "请参考实验手册："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "******************************************************\n",
    "### 步鄹2:pandaBI观察各维度特征再处理\n",
    "\n",
    "- 存储方法：大部分数据是形容不能避光阴凉的不同说法，选择删除\n",
    "\n",
    "- 原产地，甜度，颜色：含有部分取值为“其他”的数据，采用同一红酒品牌的众数替代策略予以调整\n",
    "\n",
    "- 类别，葡萄品种：采用onehot编码的理论思想对数据进行转换\n",
    "\n",
    "- 年份：数据中包含有很多“以实物为准”，“见瓶身”这种取值，但我们想知道的是酒的年龄，处理方式是利用文本处理的分词技术提取其中的年份，再与当前年份相减；部分数据的年份给的是一个范围值，此时取平均值；没有年份则用9999代替。\n",
    "\n",
    "- 酒精度：同“年份”属性一样，有数据不规范，“实物为准”的取值问题，同样采用文本处理的分词技术提取酒精度的数值。\n",
    "- 保质期：书写格式非常不统一，有些是按天为单位，有些是按年为单位，且有数字有中文的不同表达，该属性予以删除。\n",
    "\n",
    "******************************************************"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.drop([\"保质期\",\"存储方法\"], axis=1, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 处理 原产地，甜度，颜色\n",
    "def process_others(col, gp_col, df_other, df_mode,df):\n",
    "    other_series = df_other[col]\n",
    "    names = list(df.loc[other_series,gp_col])\n",
    "    t = df_mode.loc[names,col]\n",
    "    t.index = df.loc[other_series,col].index #col中含有“其它”的索引\n",
    "    df.loc[other_series,col] = t\n",
    "    return df\n",
    "\n",
    "cols = [\"原产地\",\"甜度\",\"颜色\"] #需要处理的列\n",
    "gp_col = 'keyword'  #分组列\n",
    "df_mode = df.groupby('keyword').agg(lambda x: x.value_counts().index[0]) #根据keyword（品牌）分组计算众数\n",
    "# print(df_mode[cols]) #每个红酒品牌在属性列上的众数\n",
    "\n",
    "for col in cols:\n",
    "    df_other = pd.DataFrame(df[col]==\"其它\") #col中存在“其它”的行\n",
    "    df = process_others(col, gp_col, df_other, df_mode, df)\n",
    "    #因为某品牌红酒在某列上的众数可能是“其它”，经过众数替换后再删除仍存在的“其它”的行\n",
    "    df = df[~df[col].isin([\"其它\"])] #通过~取反，选取col中不包含“其它”的行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10951, 13)"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*******************************************************\n",
    "### 步鄹3:处理特征类别\n",
    "本节以”葡萄品种“，”酒精度“为例，讲解处理过程，其他属性的处理在前面小节的处理流程中均有涉及，学生可自行完成。\n",
    "\n",
    "1. 处理 葡萄品种 的操作流程如下：\n",
    "\n",
    "  1）获取所有的葡萄品种类别\n",
    "\n",
    "  2）对每个葡萄品种新增一维来表示，假设共有6种葡萄品种，则需要6维来表示该属性值\n",
    "  \n",
    "具体代码如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 处理 类别\n",
    "# list(df.groupby(\"类别\").count().index)\n",
    "lbs = [\"冰酒/贵腐/甜酒\",\"白葡萄酒\",\"果味葡萄酒\",\"桃红葡萄酒\",\"起泡酒/香槟\",\"红葡萄酒\"]\n",
    "\n",
    "df[\"冰酒/贵腐/甜酒\"] = df['类别'].apply(lambda x : 1 if str(x).find(\"冰酒\") != -1 or str(x).find(\"贵腐\")!= -1 or str(x).find(\"甜酒\")!= -1 else 0)\n",
    "df[\"白葡萄酒\"] = df['类别'].apply(lambda x : 1 if str(x).find(\"白葡萄酒\") != -1 else 0)\n",
    "df[\"果味葡萄酒\"] = df['类别'].apply(lambda x : 1 if str(x).find(\"果味葡萄酒\") != -1 else 0)\n",
    "df[\"桃红葡萄酒\"] = df['类别'].apply(lambda x : 1 if str(x).find(\"桃红葡萄酒\") != -1 else 0)\n",
    "df[\"红葡萄酒\"] = df['类别'].apply(lambda x : 1 if str(x).find(\"红葡萄酒\") != -1 else 0)\n",
    "df[\"起泡酒/香槟\"] = df['类别'].apply(lambda x : 1 if str(x).find(\"起泡酒\") != -1 or str(x).find(\"香槟\") != -1 else 0)\n",
    "\n",
    "# df[['类别']+lbs].head\n",
    "df.drop(\"类别\", axis=1, inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*************************************************\n",
    "### 步鄹4:处理葡萄品种\n",
    "具体代码如下：   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['马尔贝克（Malbec）', '其它', '梅洛（Merlot）', '仙粉黛（Zinfandel）', '赤霞珠（Cabernet Sauvignon）', '西拉/设拉子（Syrah/Shiraz）', '雷司令（Riesling）', '桑娇维塞（Sangiovese）', '黑皮诺（Pinot Noir）', '长相思（Sauvignon Blanc）', '内比奥罗（Nebbiolo）', '佳美（Gamay）', '品丽珠（Cabernet Franc）', '匹诺塔吉（Pinotage）', '霞多丽（Chardonnay）', '蛇龙珠（Cabernet Gernischt）', '佳美娜（Carmenere）']\n"
     ]
    }
   ],
   "source": [
    "# 处理葡萄品种\n",
    "## 获取葡萄的所有品种类别\n",
    "tmp = list(df.groupby(\"葡萄品种\").count().index)\n",
    "graps = []\n",
    "for i in tmp:\n",
    "    graps += i.split(\"|\")\n",
    "graps = list(set(graps))\n",
    "print(graps)\n",
    "del tmp\n",
    "\n",
    "## 处理每个葡萄品种\n",
    "for j in graps:\n",
    "    df[j] = df['葡萄品种'].apply(lambda x : 1 if str(x).find(j) != -1 else 0)\n",
    "    \n",
    "# print(df[graps+['葡萄品种']].head)\n",
    "df.drop(\"葡萄品种\", axis=1, inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "********************************************************\n",
    "### 步鄹5:处理年份\n",
    "具体代码如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "#处理年份,\n",
    "#可能出现的数字有：年份(2005,2012等)，年份区间（2016-2018等），年月日(2015.08.06,2012.05等),年数(0,1,3等),年数区间（0-3等，1-3等）\n",
    "       \n",
    "def deal_year(x):\n",
    "    numbers = []\n",
    "    for w,p in pseg.cut(x):\n",
    "        if p=='m':\n",
    "            try:numbers.append(int(w))\n",
    "            except:continue\n",
    "    if len(numbers) == 0:\n",
    "        return 99999   #年份中无数字，以99999代替\n",
    "    years=[]\n",
    "    other_nums=[]\n",
    "    for n in numbers:\n",
    "        if n >1800 and n < 2020:\n",
    "            years.append(n)\n",
    "        elif n<50:\n",
    "            other_nums.append(n)\n",
    "        else:\n",
    "            continue\n",
    "    if years:\n",
    "        return 2019 - int(np.mean(years))\n",
    "    elif other_nums:\n",
    "        return int(np.mean(other_nums))\n",
    "    else:\n",
    "        return 99999 #无合理数字，以99999代替\n",
    "      \n",
    "df[\"year\"] = df[\"年份\"].map(deal_year)\n",
    "df.drop(\"年份\", axis=1, inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "******************************************************\n",
    "### 步鄹6:处理酒精度\n",
    "具体代码如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 处理酒精度\n",
    "def deal_alcohol(x):\n",
    "    numbers = []\n",
    "    for w,p in pseg.cut(x):\n",
    "        if p=='m':\n",
    "            try:numbers.append(float(w))\n",
    "            except:continue\n",
    "    if len(numbers) > 1:\n",
    "        return np.mean(numbers)\n",
    "    elif len(numbers) == 1:\n",
    "        return numbers[0]\n",
    "    else:\n",
    "        return 99999  # 酒精中无数字，以99999代替\n",
    "        \n",
    "df[\"alcohol\"] = df[\"酒精度\"].map(deal_alcohol)\n",
    "df.drop(\"酒精度\", axis=1, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.to_csv(\"prepare_for_weibo.csv\",encoding=\"utf-8_sig\",index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "***************************************************\n",
    "## 五、知识回顾\n",
    "综上，我们把数据清理完成，学生可后续再做些异常点处理的清洗工作，本案例暂不涉及。下一节处理标签，对价格区间进行定义和设置。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*********************************************\n",
    "## 六、实验总结\n",
    "本节利用pandaBI可视化工具对数据进行再观察，对相关特征进行再清洗。下一节将对价格区间进行确定。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "***********************************************************\n",
    "***********************************************************\n",
    "# 实验3-4 定义红酒的价格区间\n",
    "## 一、实验目的\n",
    "了解pandas的常用函数\n",
    "\n",
    "了解数据清洗的基础方法\n",
    "\n",
    "## 二、实验环境\n",
    "Python3开发环境，第三方包有pandas\n",
    "\n",
    "## 三、实验原理\n",
    "本实验主要是为了确定红酒的价格区间，利用不同的分箱策略对红酒价格区间进行划分，此划分结果关系到下节的分类结果，可综合两者的效果对价格区间进行调整。\n",
    "## 四、实验步骤\n",
    "### 步鄹1:查看一下红酒的价格最小值和最大值\n",
    "具体代码如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.32\n",
      "79560.0\n"
     ]
    }
   ],
   "source": [
    "print(df[\"price\"].min())\n",
    "print(df[\"price\"].max())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "***********************************************\n",
    "### 步鄹2:三种方式对价格的划分\n",
    "查看数值分布数量的常见方式有三种：等宽分箱、等频分箱和基于聚类的分箱\n",
    "代码如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f18af7e0fd0>"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/python3/lib/python3.6/site-packages/matplotlib/font_manager.py:1328: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans\n",
      "  (prop.get_family(), self.defaultFamily[fontext]))\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1440x360 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 三种方式对价格的划分\n",
    "from sklearn.cluster import KMeans\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "plt.rcParams['font.family'] = ['sans-serif']\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "\n",
    "k = 8\n",
    "kmodel = KMeans(n_clusters = k,n_jobs=5)\n",
    "\n",
    "fig,ax= plt.subplots(1,3,figsize=(20,5))\n",
    "cat = pd.cut(df['price'],k)\n",
    "cat2 = pd.qcut(df['price'],k)\n",
    "kmodel.fit(df['price'].values.reshape(len(df),1))\n",
    "c = pd.DataFrame(kmodel.cluster_centers_).sort_values(0)\n",
    "w = c.rolling(2).mean().iloc[1:]\n",
    "w = [0] + list(w[0]) + [df['price'].max()] \n",
    "cat3 = pd.cut(df['price'], w)\n",
    "\n",
    "cat.value_counts(sort = False).plot.bar(grid= True,ax=ax[0],title = '等宽分箱')\n",
    "cat2.value_counts(sort = False).plot.bar(grid= True,ax=ax[1],title = '等频分箱')\n",
    "cat3.value_counts(sort = False).plot.bar(grid= True,ax=ax[2],title = 'KMeans聚类分箱')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*******************************************************\n",
    "### 步鄹3:等频分箱的实现\n",
    "根据上述三种价格区间的划分，选择“等频分箱”方法，由于最后一组价格区间（499,79560）跨度过大，对价格在500以上和500以下的重新分箱。\n",
    "本案例中自定义分成8个价格区间（观察下来很多属性有6-8种取值），因数据主要集中分布在500之前的数据，故设计前500包含5个区间，大于500的再设立3个区间。（注意：价格区间的个数比较自由化，可根据真实项目中的测试结果进行调整）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f18af717cc0>"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/python3/lib/python3.6/site-packages/matplotlib/font_manager.py:1328: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans\n",
      "  (prop.get_family(), self.defaultFamily[fontext]))\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABIcAAAGPCAYAAADGGrBRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3X2UpmV9J/jvT1rQiAEF7CCgEEUiGXzBVpgTd9Lq6qCTEce3kWUUDAmzHSU6YbPiTHKEnJlZ3Q3qkEQME1TMzIo5JhEmviURWzcZIYogrbxrNEAQQQWDL0Twt3/UQyw73XZVdz19V/f1+ZxTh/u57rurvl3n1E3197mv66ruDgAAAABjesDUAQAAAACYjnIIAAAAYGDKIQAAAICBKYcAAAAABqYcAgAAABiYcggAAABgYMohAAAAgIGtmToAAMAUqur4JL+6hVN/muQ5Wxi/tbtfUlUXJdlvC+dfnOR/T/K/buHcf+ruD213WACAOVIOAQCjOjDJmd395/cPVNXeSX4vycbu/rXFF1fV+2aH3+vup2927jeTPCjJTyVZ3933Ljr3c0nWzuevAACw40wrAwAAABiYcggAAABgYMohAAAAgIEphwAAAAAGphwCAAAAGJhyCAAAAGBgyiEAAACAgSmHAAAAAAa2ZuoAAAATOruqvrHo9R5Jbkny8qp6+mbX7jf771FVtXGzc49J8tuz449WVW/2585eobwAACuuunvbVwEAAACwWzKtDAAAAGBgyiEAAACAgSmHAAAAAAa2Khak3n///fvQQw+dOgbM1be+9a085CEPmToGADvI/Rxg9+B+zgguv/zyO7r7gG1dtyrKoUMPPTSf/vSnp44Bc7Vx48asX79+6hgA7CD3c4Ddg/s5I6iqLy/lOtPKAAAAAAamHAIAAAAYmHIIAAAAYGDKIQAAAICBKYcAAAAABqYcAgAAABiYcggAAABgYMohAAAAgIEphwAAAAAGphwCAAAAGJhyCAAAAGBga6YOAADsgDP3mTrBeI44Kznz+KlTjOXMu6ZOAAC7NeXQoA494wNTRxjO6Ufdm5N933eqL73xX0wdAQAAYNUzrQwAAABgYJ4cAgAAmNhRFxw1dYThbNh7Q0674LSpYwxl00mbpo7AVnhyCAAAAGBgyiEAAACAgSmHAAAAAAamHAIAAAAYmHIIAAAAYGDKIQAAAICBKYcAAAAABqYcAgAAABiYcggAAABgYMohAAAAgIEphwAAAAAGphwCAAAAGJhyCAAAAGBgyiEAAACAgSmHAAAAAAamHAIAAAAYmHIIAAAAYGDKIQAAAICBKYcAAAAABqYcAgAAABiYcggAAABgYMohAAAAgIEphwAAAAAGphwCAAAAGJhyCAAAAGBgSy6HqmqPqrqiqv5k9vqwqrqsqm6sqvdW1Z6z8b1mr2+cnT90PtEBAAAA2FHLeXLoNUmuWfT6TUne0t2PTfKNJKfMxk9J8o3Z+Ftm1wEAAACwCi2pHKqqg5P8iyS/N3tdSZ6Z5H2zSy5I8oLZ8fGz15mdf9bsegAAAABWmerubV9U9b4k/1eShyb5P5KcnOTS2dNBqapDknyou/9JVX0uyXHdffPs3BeSHNPdd2z2OU9NcmqSrF279ikXXnjhiv2l2LZNt9w1dYThrH1wctt3pk4xlqMO2mfqCDB/t145dYLh3L3XI7P3PX87dYyxHPikqRPA3F39taunjjCcA/Y4ILffd/vUMYZy5H5HTh1hOM94xjMu7+5127puzbYuqKqfS/LV7r68qtavRLgk6e7zkpyXJOvWrev161fsU7MEJ5/xgakjDOf0o+7N2Zu2+SPHCvrSieunjgDzd+bxUycYzsYjzsr6694wdYyxnOBNLXZ/p11w2tQRhrNh7w059+5zp44xlE0v2jR1BLZiKf9S/Zkkz6+q5yV5UJIfT/JfkuxbVWu6+94kBye5ZXb9LUkOSXJzVa1Jsk+Sr614cgAAAAB22DbXHOru13f3wd19aJKXJbmku09M8rEkL55ddlKSi2bHF89eZ3b+kl7K3DUAAAAAdrrl7Fa2udcl+ZWqujHJfknOn42fn2S/2fivJDljxyICAAAAMC/LWgCluzcm2Tg7/mKSp23hmu8meckKZAMAAABgznbkySEAAAAAdnHKIQAAAICBKYcAAAAABqYcAgAAABiYcggAAABgYMohAAAAgIEphwAAAAAGphwCAAAAGJhyCAAAAGBgyiEAAACAgSmHAAAAAAamHAIAAAAYmHIIAAAAYGDKIQAAAICBKYcAAAAABqYcAgAAABiYcggAAABgYMohAAAAgIEphwAAAAAGphwCAAAAGJhyCAAAAGBgyiEAAACAgSmHAAAAAAamHAIAAAAYmHIIAAAAYGDKIQAAAICBKYcAAAAABqYcAgAAABiYcggAAABgYMohAAAAgIEphwAAAAAGphwCAAAAGJhyCAAAAGBgyiEAAACAgSmHAAAAAAamHAIAAAAYmHIIAAAAYGDKIQAAAICBKYcAAAAABqYcAgAAABiYcggAAABgYMohAAAAgIEphwAAAAAGphwCAAAAGJhyCAAAAGBgyiEAAACAgSmHAAAAAAa2zXKoqh5UVX9VVZ+tqs9X1Vmz8cOq6rKqurGq3ltVe87G95q9vnF2/tD5/hUAAAAA2F5LeXLoniTP7O4nJnlSkuOq6tgkb0rylu5+bJJvJDlldv0pSb4xG3/L7DoAAAAAVqFtlkO94O7ZywfOPjrJM5O8bzZ+QZIXzI6Pn73O7PyzqqpWLDEAAAAAK2ZJaw5V1R5VdWWSryb5syRfSHJnd987u+TmJAfNjg9KclOSzM7flWS/lQwNAAAAwMqo7l76xVX7JvnjJL+e5F2zqWOpqkOSfKi7/0lVfS7Jcd198+zcF5Ic0913bPa5Tk1yapKsXbv2KRdeeOFK/H1Yok233DV1hOGsfXBy23emTjGWow7aZ+oIMH+3Xjl1guHcvdcjs/c9fzt1jLEc+KSpE8DcXf21q6eOMJwD9jggt993+9QxhnLkfkdOHWE4z3jGMy7v7nXbum7Ncj5pd99ZVR9L8k+T7FtVa2ZPBx2c5JbZZbckOSTJzVW1Jsk+Sb62hc91XpLzkmTdunW9fv365URhB518xgemjjCc04+6N2dvWtaPHDvoSyeunzoCzN+Zx0+dYDgbjzgr6697w9QxxnKCN7XY/Z12wWlTRxjOhr035Ny7z506xlA2vWjT1BHYiqXsVnbA7ImhVNWDkzw7yTVJPpbkxbPLTkpy0ez44tnrzM5f0st5PAkAAACAnWYpjzEcmOSCqtojC2XSH3T3n1TV1UkurKr/mOSKJOfPrj8/ye9X1Y1Jvp7kZXPIDQAAAMAK2GY51N1XJXnyFsa/mORpWxj/bpKXrEg6AAAAAOZqSbuVAQAAALB7Ug4BAAAADEw5BAAAADAw5RAAAADAwJRDAAAAAANTDgEAAAAMTDkEAAAAMDDlEAAAAMDAlEMAAAAAA1MOAQAAAAxMOQQAAAAwMOUQAAAAwMCUQwAAAAADUw4BAAAADEw5BAAAADAw5RAAAADAwJRDAAAAAANTDgEAAAAMTDkEAAAAMDDlEAAAAMDAlEMAAAAAA1MOAQAAAAxMOQQAAAAwMOUQAAAAwMCUQwAAAAADUw4BAAAADEw5BAAAADAw5RAAAADAwJRDAAAAAANTDgEAAAAMTDkEAAAAMDDlEAAAAMDAlEMAAAAAA1MOAQAAAAxMOQQAAAAwMOUQAAAAwMCUQwAAAAADUw4BAAAADEw5BAAAADAw5RAAAADAwJRDAAAAAANTDgEAAAAMTDkEAAAAMDDlEAAAAMDAlEMAAAAAA1MOAQAAAAxMOQQAAAAwMOUQAAAAwMC2WQ5V1SFV9bGqurqqPl9Vr5mNP7yq/qyqbpj992Gz8aqqc6rqxqq6qqqOnvdfAgAAAIDts5Qnh+5Ncnp3H5nk2CSvqqojk5yR5KPdfXiSj85eJ8lzkxw++zg1ybkrnhoAAACAFbHNcqi7b+3uz8yO/y7JNUkOSnJ8kgtml12Q5AWz4+OTvLsXXJpk36o6cMWTAwAAALDDlrXmUFUdmuTJSS5Lsra7b52d+kqStbPjg5LctOiP3TwbAwAAAGCVWbPUC6tq7yR/mOS13f3NqvqHc93dVdXL+cJVdWoWpp1l7dq12bhx43L+ODvo9KPunTrCcNY+2Pd9Z3NfYQhHnDV1guHcvdcjs9H3fedyP2cAG/beMHWE4RywxwG+7zuZ389XryWVQ1X1wCwUQ/+9u/9oNnxbVR3Y3bfOpo19dTZ+S5JDFv3xg2djP6S7z0tyXpKsW7eu169fv31/A7bLyWd8YOoIwzn9qHtz9qYl97GsgC+duH7qCDB/Zx4/dYLhbDzirKy/7g1TxxjLCXdNnQDm7rQLTps6wnA27L0h595tidydadOLNk0dga1Yym5lleT8JNd095sXnbo4yUmz45OSXLRo/BWzXcuOTXLXoulnAAAAAKwiS3mM4WeSvDzJpqq6cjb275O8MckfVNUpSb6c5KWzcx9M8rwkNyb5dpJXrmhiAAAAAFbMNsuh7v6LJLWV08/awvWd5FU7mAsAAACAnWBZu5UBAAAAsHtRDgEAAAAMTDkEAAAAMDDlEAAAAMDAlEMAAAAAA1MOAQAAAAxMOQQAAAAwMOUQAAAAwMCUQwAAAAADUw4BAAAADEw5BAAAADAw5RAAAADAwJRDAAAAAANTDgEAAAAMTDkEAAAAMDDlEAAAAMDAlEMAAAAAA1MOAQAAAAxMOQQAAAAwMOUQAAAAwMCUQwAAAAADUw4BAAAADEw5BAAAADAw5RAAAADAwJRDAAAAAANTDgEAAAAMTDkEAAAAMDDlEAAAAMDAlEMAAAAAA1MOAQAAAAxMOQQAAAAwMOUQAAAAwMCUQwAAAAADUw4BAAAADEw5BAAAADAw5RAAAADAwJRDAAAAAANTDgEAAAAMTDkEAAAAMDDlEAAAAMDAlEMAAAAAA1MOAQAAAAxMOQQAAAAwMOUQAAAAwMCUQwAAAAADUw4BAAAADEw5BAAAADCwbZZDVfWOqvpqVX1u0djDq+rPquqG2X8fNhuvqjqnqm6sqquq6uh5hgcAAABgxyzlyaF3JTlus7Ezkny0uw9P8tHZ6yR5bpLDZx+nJjl3ZWICAAAAMA/bLIe6+xNJvr7Z8PFJLpgdX5DkBYvG390LLk2yb1UduFJhAQAAAFhZ27vm0NruvnV2/JUka2fHByW5adF1N8/GAAAAAFiF1uzoJ+jurqpe7p+rqlOzMPUsa9euzcaNG3c0Cstw+lH3Th1hOGsf7Pu+s7mvMIQjzpo6wXDu3uuR2ej7vnO5nzOADXtvmDrCcA7Y4wDf953M7+er1/aWQ7dV1YHdfets2thXZ+O3JDlk0XUHz8b+ke4+L8l5SbJu3bpev379dkZhe5x8xgemjjCc04+6N2dv2uE+lmX40onrp44A83fm8VMnGM7GI87K+uveMHWMsZxw19QJYO5Ou+C0qSMMZ8PeG3Lu3ZbJ3Zk2vWjT1BHYiu2dVnZxkpNmxycluWjR+Ctmu5Ydm+SuRdPPAAAAAFhltvkYQ1W9J8n6JPtX1c1J3pDkjUn+oKpOSfLlJC+dXf7BJM9LcmOSbyd55RwyAwAAALBCtlkOdfcJWzn1rC1c20letaOhAAAAANg5tndaGQAAAAC7AeUQAAAAwMCUQwAAAAADUw4BAAAADEw5BAAAADAw5RAAAADAwJRDAAAAAANTDgEAAAAMTDkEAAAAMDDlEAAAAMDAlEMAAAAAA1MOAQAAAAxMOQQAAAAwMOUQAAAAwMCUQwAAAAADUw4BAAAADEw5BAAAADAw5RAAAADAwJRDAAAAAANTDgEAAAAMTDkEAAAAMDDlEAAAAMDAlEMAAAAAA1MOAQAAAAxMOQQAAAAwMOUQAAAAwMCUQwAAAAADUw4BAAAADEw5BAAAADAw5RAAAADAwJRDAAAAAANTDgEAAAAMTDkEAAAAMDDlEAAAAMDAlEMAAAAAA1MOAQAAAAxMOQQAAAAwMOUQAAAAwMCUQwAAAAADUw4BAAAADEw5BAAAADAw5RAAAADAwJRDAAAAAANTDgEAAAAMTDkEAAAAMDDlEAAAAMDAlEMAAAAAA1MOAQAAAAxsLuVQVR1XVddV1Y1VdcY8vgYAAAAAO27Fy6Gq2iPJ7yR5bpIjk5xQVUeu9NcBAAAAYMfN48mhpyW5sbu/2N1/n+TCJMfP4esAAAAAsIPmUQ4dlOSmRa9vno0BAAAAsMpUd6/sJ6x6cZLjuvsXZq9fnuSY7n71ZtedmuTU2csjkly3okFg9dk/yR1ThwBgh7mfA+we3M8ZwaO7+4BtXbRmDl/4liSHLHp98Gzsh3T3eUnOm8PXh1Wpqj7d3eumzgHAjnE/B9g9uJ/DD8xjWtmnkhxeVYdV1Z5JXpbk4jl8HQAAAAB20Io/OdTd91bVq5N8JMkeSd7R3Z9f6a8DAAAAwI6bx7SydPcHk3xwHp8bdmGmUQLsHtzPAXYP7ucws+ILUgMAAACw65jHmkMAAAAA7CKUQwAAAAADm8uaQwAAu4OqWsqOq1/v7pPnnQWA7VdVv7KEy77V3b879zCwCllzCOagqq5awmW3d/ez5h4GgO1WVTck+YUfdUmS3+nun95JkQDYDlV1a5Jzs3Df3poTu/txOykSrCqeHIL52CPJ837E+UqylHejAZjWf+juj/+oC6rqrJ0VBoDt9vvd/Rs/6oKqesjOCgOrjSeHYA6q6und/Rc7eg0AAADMm3II5qyqHp4k3f31qbMAsDxVtU+S1yd5QZJHJOkkX01yUZI3dvedE8YDYBmq6p9n4X5+0GzoliQXdfeHp0sFq4NyCOagqh6V5P9O8qwkd2ZhGtmPJ7kkyRnd/aXp0gGwVFX1kSzcuy/o7q/Mxn4iyUlJntXdz5kyHwBLU1VvTfK4JO9OcvNs+OAkr0hyQ3e/ZqpssBooh2AOquqTSd6a5H3dfd9sbI8kL0ny2u4+dsp8ACxNVV3X3Ucs9xwAq0tVXb+lxaarqpJc392HTxALVo0HTB0AdlP7d/d77y+GkqS77+vuC5PsN2EuAJbny1X1f1bV2vsHqmptVb0uyU0T5gJgeb5bVU/dwvhTk3x3Z4eB1cZuZTAfl1fV25JckB/84+GQLExDuGKyVAAs179OckaSj1fVI2Zjt2Vhx8mXTpYKgOU6Ocm5VfXQ/GBa2SFJ7pqdg6GZVgZzUFV7JjklyfH5wYJ3Nyf5H0nO7+57psoGAACjmq0b9w8LUt+/nhyMTjkEALAdquro7v7M1DkAAHaUNYdgJ6uqn5s6AwArYsPUAQDYcVWl6Gd4yiHY+ba0EB4Au5ju/sWpMwCw47r76KkzwNRMKwMA2IaqWpeFhUvvy8KWx9dOHAmA7TDbfXLxmkO3TZkHVgvlEMxJVf1UfnhB6luSXNzd10yXCoDlqKqfTXJ2kjuTPCXJXyZ5WJLvJXl5d9vOHmAXUFVPSvL2JPtk4ffyJDk4C/f3X7KGHKNTDsEcVNXrkpyQ5ML8YKvMg5O8LMmF3f3GqbIBsHRVdUWS53T37VV1WJI3d/e/qqpnJ/nV7n7OxBEBWIKqujLJv+3uyzYbPzbJ73b3E6dJBquDcgjmoKquT/LT3f29zcb3TPL57j58mmQALEdVXdXdT5gd75HkU/evTVFVn+/un540IABLUlU3bO138Kq6sbsfu7MzwWqyZuoAsJv6fpJHJvnyZuMHzs4BsGv4dFWdn+SSJM9PsjFJqurHkuwxYS4AludDVfWBJO9Ocv+U4EOSvCLJhydLBauEJ4dgDqrquCS/neSG/OB/Po9K8tgkr+5u/wMC2AVU1QOT/GKSI5N8Nsk7uvu+qnpwkkd09+ZvAgCwSlXVc7PlNUE/OF0qWB2UQzAnVfWAJE/LD//P51Pdfd90qQAAAOCHPWDqALC76u7vd/el3f2Hs49LFUMAu5aq2ruqfqOqPldVd1XV7VV1aVWdPHU2AJauql5dVfvPjh9TVZ+oqm9U1WVVddTU+WBqyiGYg6p6wuwfDzdV1XlV9bBF5/5qymwALMt/T/LFJMclOSvJOUlenuQZVfWfpwwGwLJs6O47ZsfnJHlLdz8syeuysMU9DE05BPPxtiRnJjkqyfVJ/qKqHjM798CpQgGwbId297u6++bufnOS53f3DUlemeSFE2cDYOkWb8b0iO7+4yTp7o1JHjpJIlhFlEMwHw/t7g93953d/ZtJXp3kw1V1bBILfQHsOr5VVU9Pkqp6fpKvJwtTh5PUlMEAWJb3VdW7quonk/xxVb22qh5dVa9M8jdTh4OpWZAa5qCqPpvkn3X3XYvGnpDkD5M8vLv3mywcAEs2u3f/XpLDk3w+ySndfV1VHZDkhO4+Z9KAACzZbL24DUkek2SvLOwq/P4kb1r8ezuMSDkEc1BV/1uSL3b3pZuNPyrJr3f3L06TDAAAAH6YcggAYCuq6pgk13T3N6vqwUnOSHJ0kquT/GfvNAPsmqrqsCRPTnJ1d187dR6YmjWHYA6q6o+q6sSq2nvqLADskHck+fbs+L8k2SfJm2Zj75wqFADLU1XvX3R8fJJLkvzLJBfPppvB0NZs+xJgOxyT5PtJfquq/jzJe5J8oLv/ftpYACzTA7r73tnxuu4+enb8F1V15VShAFi2Ry86fl2SZ3b3X1fV/kk+muRdk6SCVcKTQzAfX+3uFyc5NMn/SPKLSW6pqndW1XMmTQbAcnxutpNNkny2qtYlSVU9Lsn3posFwDItXk9lTXf/dZJ09x1ZeFMXhmbNIZiDqvrMoneX7x/bL8lLkry0u585TTIAlqOq9snCdLL/JckdWVhv6KbZxy9392cnjAfAElXVfUm+laSysFPZo7v71qraM8mnu/sJkwaEiSmHYA6q6hPd/c+mzgHAyqiqH09yWBam5N/c3bdNHAmAFVBV+yZ5fHd/cuosMCXlEADAdqiqvbv77qlzALA8VfWwJPd19zenzgKrhTWHAAC2z9VTBwBgaarqkVX17qq6KwvThD9XVX9TVWdW1QOnzgdT8+QQAMBWVNWvbO1Ukv/Q3Q/fmXkA2D5VdUmS3+jujVX1wiysJfdrSV6f5BHdfeqkAWFiyiEAgK2oqu8m+X+S3LuF0/+uu/fdyZEA2A5V9dnufuKi15d391Nmx9d2909Nlw6mt2bqADCSqjowyde7+56pswCwJJ9J8v7uvnzzE1X1CxPkAWD73F5V/ybJx5K8MMmXkqSqKpZbAT8EsJP9fpJrq+o3pw4CwJK8MsmXt3Ju3c4MAsAO+fkkz0/ykSTHJHn1bPzhWZhaBkMzrQx2stm7E0d29+enzgIAAADKIZijqjogycFJ7kvyRVseAwDAzldVb07yh939l1NngdVIOQRzUFVHJjknyaFJHpXkiiSPSPLxJK/p7rumSwcAAGOpqtuzME34gCTvTfKe7r5i2lSwelhzCObjHUle1d2PTfL0JNd292FJ/jLJ+ZMmAwCA8dzc3euSPDvJ3yX5b1V1bVW9oaoeN3E2mJwnh2AOtrBV5me6++jZ8TXd/fjp0gGwo6rql5J8LQtTFLa0zT0Aq8ji38cXjT0hyQlJXjJ7UxeG5ckhmI8vVNWvV9XPVNXZSa5Mkqp6YPzcAewOKgtPhv7R1EEAWJLafKC7r+ru1yuGwJNDMBdVtW+Sf5/kyCSfTfLG7v67qtonyeO7+9JJAwIAwECqam+bw8DWKYcAAH6EqvrnSV6Q5KDZ0C1JLuruD0+XCgBg5SiHYA6q6gFJTkryoiSHZGEr++uTvL27N04YDYBlqKq3JnlckncnuXk2fHCSVyS5obtfM1U2AICVohyCOaiqd2Zhq8w/T/LiJN9M8v8leV0W3m3+rQnjAbBEVXV9d/+jXWyqqpJc392HTxALAGBFKYdgDqrqqu5+wqLXl3b3sVW1V5Ir7VYGsGuoqquSnNLdn9ps/GlJzu/uo6ZJBgCwctZMHQB2U9+rqsd09xeq6ugkf58k3X1PVWlkAXYdJyc5t6oemh9MKzskyV2zcwDswqrqmtnh73T3b08aBiakHIL5+NUkH6uqe7Lwc/ayJKmqA5L8yZTBAFi67v5MkmOq6ieyaEHq7v7KhLEAWCHd/fiq2i/JsVNngSmZVgZzMluPYr/uvmPqLAAAQFJVa/PDZf9tU+aB1cKTQzA/T03SSe6oqiOTHJfk2u7+4LSxAFgJVfWZ7j566hwAbFtVPSnJ25Psk+SW2fDBVXVnkl+aPSkKw/LkEMxBVb0hyXOzUMD+WZJjknwsybOTfKS7/9OE8QAAYChVdWWSf9vdl202fmyS3+3uJ06TDFYH5RDMQVVtSvKkJHsl+UqSg7v7m1X14CSXLd7JDIDVzzQEgF1bVd3Q3Ydv5dyN3f3YnZ0JVhPTymA+7u3u+5J8u6q+0N3fTJLu/k5VfX/ibAAskWkIALuND1XVB5K8O8lNs7FDkrwiyYcnSwWrhHII5uPvq+rHuvvbSZ5y/2BV7ZNEOQSw63hXtj4N4Z1JTEMA2AV09y9X1XOTHJ9FT4JmYQt7a4IyPNPKYA6qaq/uvmcL4/snObC7N00QC4BlMg0BABiBJ4dgDrZUDM3G70hia3uAXYdpCAC7uao6tbvPmzoHTEk5BDtZVf1Jd//c1DkA2DbTEACGUFMHgKmZVgY7WVUd2N23Tp0DAAAAEuUQzF1VPTxJuvvrU2cBYHmqao8kv5Dk4CQf6u7/uejcr3X3f5wsHADLUlU/meSFWZgefF+S65P8v/fvLAwje8DUAWB3VFWPqqoLq+r2JJcl+auq+ups7NBp0wGwDL+b5GeTfC3Jb1XVmxede+E0kQBYrqr65SRvT/KgJE9NslcWSqJLq2r9hNFgVfDkEMxBVX0yyVuTvK+775uN7ZHkJUle293HTpkPgKWpqqu6+wmz4zVJ3pZk/yQnJLm0u588ZT4AlqaqNiV5UnffV1U/luSD3b2+qh6V5CL3c0bnySGYj/27+733F0NJ0t33dfeFSfabMBcAy7Pn/QfdfW93n5rkyiSXJNl7slQAbI/7N2TaK7N7eHf/TZIHTpYIVgnlEMzH5VX1tqo6pqoeOfvQO4FpAAAEUElEQVQ4pqreluSKqcMBsGSfrqrjFg90928keWeSQydJBMD2+L0kn6qq/5rkk0l+J0mq6oAk1gZleKaVwRxU1Z5JTsk/3vr44iTnd/c9U2UDAIARVdVPJ3l8ks9197VT54HVRDkEALAVVfX8JH/a3d+dOgsAO272pNDBWdit7IvdfffEkWBVUA7BHMwWLT0lyQvyw08OXZSFJ4e+N1U2AJauqr6T5FtJPpTkPUk+sng9OQB2DVV1ZJJzsjAl+FFZWOrhEUk+nuQ13X3XdOlgetYcgvn4/SRPSnJWkufNPs5K8sQk/23CXAAsz7VJDk/yiSSnJ/nbqnp7Vf3stLEAWKZ3JHlVdz82ydOTXNvdhyX5yyTnT5oMVgFPDsEcVNX13f245Z4DYHWpqs9099GLXv9EkpdmYSv7g7v7kMnCAbBkVfXZ7n7iotf/cH+vqmu6+/HTpYPpeXII5uPrVfWSqvqHn7GqekBV/esk35gwFwDLU4tfdPdXuvuc7v6nWXjnGYBdwxeq6ter6meq6uwkVyZJVT0w/l0MfghgTl6W5MVJbquq66vqhiRfSfLC2TkAdg3/bmsnuvvLOzMIADvk55M8NMnrk3w3yWtm4z+W5KSpQsFqYVoZzFlV7Zck3f21qbMAsDxVVb2NX5aWcg0AwGrmySGYs1kp9ONV9cKq+qmp8wCwLB+rqtOq6lGLB6tqz6p6ZlVdEO84A6x6VfXqqtp/dvyYqvpEVd1ZVZdV1VFT54OpKYdgDqrq/YuOj09ySZJ/meTiqjp5qlwALNtxSe5L8p6q+tuqurqqvpjkhiwsSv3W7n7XlAEBWJIN3X3H7PicJG/p7n2TvC7J26eLBauDaWUwB1V1RXc/eXb8P5Oc2N1/PXu34qOLd0oAYNcwW7R0/yTf6e47p84DwNJV1XXdfcTs+FPd/dRF567q7idMlw6m58khmI/Freua7v7rJJm9W/H9aSIBsCO6+3vdfatiCGCX9L6qeldV/WSSP66q11bVo6vqlUn+ZupwMDVPDsEcVNV9Sb6VhS2Q90ry6O6+tar2TPJp70wAAMDONVveYUOSx2Thd/Sbkrw/yZu6+64Jo8HklEOwE1XVvkke392fnDoLAAAAJKaVwVxUVW1pvLvvvL8Y2to1AADAzlNVz546A0xNOQTzYetjAADYNZw/dQCYmmllMAdV9aAkP5/kxCSHJbkzyYOS7JHkT5O8rbuvmC4hAACMo6ou3tqpJM/s7ofszDyw2iiHYM5sfQwAANOqqm8k+TdJ7t78VJL3dvfanZ8KVo81UweA3V13fy/JrVPnAACAgV2a5Nvd/fHNT1TVdRPkgVXFk0MAAAAAA7MgNQAAALu1pewUbDdhRqYcAgAAYHdnN2H4EUwrAwAAYLdmN2H40ZRDAAAADMNuwvCPKYcAAAAABmbNIQAAAICBKYcAAAAABqYcAgAAABiYcggAAABgYMohAAAAgIH9/7uS3DNCG3fLAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 1440x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df3 = df[df[\"price\"]>500]\n",
    "fig,ax= plt.subplots(1,1,figsize=(20,5))\n",
    "cat4 = pd.qcut(df3['price'],3)\n",
    "cat4.value_counts(sort = False).plot.bar(grid= True,title = '等频分箱')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f18af6dea90>"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/python3/lib/python3.6/site-packages/matplotlib/font_manager.py:1328: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans\n",
      "  (prop.get_family(), self.defaultFamily[fontext]))\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1440x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df4 = df[df[\"price\"]<=500]\n",
    "fig,ax= plt.subplots(1,1,figsize=(20,5))\n",
    "cat4 = pd.qcut(df4['price'],5)\n",
    "cat4.value_counts(sort = False).plot.bar(grid= True,title = '等频分箱')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "***************************************************\n",
    "### 步鄹4:处理价格区间\n",
    "结合上述统计结果：将价格定位成以下8个区间：[0,50],[50-100],[100-150],[150-250],[250-500],[500-1000],[1000-2000],[2000-MAX]\n",
    "处理代码如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 处理价格区间\n",
    "# 价格区间划分为：[0,50],[50,100],[100,150],[150,250],[250,500],[500,1000],[1000,2000],[2000,max]\n",
    "import sys \n",
    "def get_price_scope(price):        #获取价格区间\n",
    "    scope = [[0,50],[50,100],[100,150],[150,250],[250,500],[500,1000],[1000,2000],[2000,sys.maxsize]]\n",
    "    for j in range(len(scope)):\n",
    "        if price >= scope[j][0] and price < scope[j][1]:\n",
    "            result = '-'.join(str(x) for x in scope[j])\n",
    "    return result\n",
    "df['price'] = df['price'].map(get_price_scope)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**********************************************************\n",
    "### 步鄹5:保存结果数据\n",
    "本节的清洗数据综上已收尾，将处理结果保存为 wine_processed.csv 供后续模型训练用。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.to_csv(\"wine_processed.csv\",encoding=\"utf-8_sig\",index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**********************************************************\n",
    "## 五、实验结果\n",
    "本实验完成了全部分清洗数据工作，处理结果保存为 wine_processed.csv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**********************************************************\n",
    "## 六、实验总结\n",
    "本节对价格区间进行定义，连带前三节的处理结果保存为csv文件，下一节将对本文件进行模型训练。\n",
    "**********************************************************"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
